package metier;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import DB.Request;
import bean.Formateur;
import bean.Matiere;

public class MatiereMetier {
	private static MatiereMetier singleton = new MatiereMetier();
	
	public static MatiereMetier getInstance(){
		return singleton;
	}
	
	public Matiere save(Matiere matiere){
		if(matiere != null){
			String query;
			if (matiere.getId_matiere() != null) {
				//UPDATE
				query = "UPDATE matiere SET nom=?, abreviation=? WHERE id_matiere="+matiere.getId_matiere();
			} else {
				//INSERT
				query = "INSERT INTO matiere(nom,abreviation) VALUES (?,?)";
			}
			List<Object> param = new ArrayList<Object>();
			param.add(matiere.getNom());
			param.add(matiere.getAbreviation());
			Request.getInstance().executeUpdate(query, param);
			if(matiere.getId_matiere() == null){
				matiere.setId_matiere(getLastId());
			}
			//liste des formateurs
			if(matiere.getFormateurs() != null && matiere.getFormateurs().size() > 0){
				query = "DELETE FROM quifaitquoi WHERE id_matiere = " + matiere.getId_matiere();
				Request.getInstance().executeUpdate(query);
				query = "INSERT INTO quifaitquoi (id_formateur,id_matiere) VALUES (?,?)";
				List<Formateur> formateurs = matiere.getFormateurs(); 
				for(Formateur formateur : formateurs){
					param.clear();
					param.add(formateur.getId_formateur());
					param.add(matiere.getId_matiere());
					Request.getInstance().executeUpdate(query, param);
				}
			}
		}
		return getById(getLastId());
		
	}
	
	public void delete(Matiere matiere){
		String query = "DELETE FROM matiere WHERE id_matiere=" + matiere.getId_matiere();
		Request.getInstance().executeUpdate(query);
	}
	
	public Matiere getById(Integer id){
		Matiere matiere = null;
		Formateur formateur = new Formateur();
		List<Formateur> formateurs = new ArrayList<Formateur>();
		String query = "SELECT F.* FROM formateur F, quifaitquoi Q WHERE Q.id_formateur=F.id_formateur AND Q.id_matiere ="+ id;
		ResultSet resultat = Request.getInstance().executeQuery(query);
		String query2 = "SELECT * FROM matiere WHERE id_matiere=" + id;
		ResultSet resultat2 = Request.getInstance().executeQuery(query2);
		try {
			while(resultat.next()){
				formateur = new Formateur(resultat.getInt(1),resultat.getString(2), resultat.getString(3), resultat.getString(4), resultat.getString(5), resultat.getString(6), resultat.getString(7), resultat.getString(8), resultat.getString(9), resultat.getString(10),resultat.getString(11), UtilisateurMetier.getInstance().getById(resultat.getInt(12)),null);
				formateurs.add(formateur);
			}
			while(resultat2.next()){
				matiere = new Matiere(id, resultat2.getString("nom"), resultat2.getString("abreviation"),formateurs);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return matiere;
	}
	
	public List<Matiere> getAll(){
		List<Matiere> matieres = new ArrayList<Matiere>();
		String query = "SELECT * FROM matiere";
		ResultSet resultat = Request.getInstance().executeQuery(query);
		try {
			while(resultat.next()){
				List<Formateur> formateurs = new ArrayList<Formateur>();
				String query2 = "SELECT F.* FROM formateur F, quifaitquoi Q WHERE Q.id_formateur=F.id_formateur AND Q.id_matiere ="+ resultat.getInt("id_matiere");
				ResultSet resultat2 = Request.getInstance().executeQuery(query2);
				while(resultat2.next()){
					Formateur formateur = new Formateur(resultat2.getInt(1),resultat2.getString(2), resultat2.getString(3), resultat2.getString(4), resultat2.getString(5), resultat2.getString(6), resultat2.getString(7), resultat2.getString(8), resultat2.getString(9), resultat2.getString(10),resultat2.getString(11), UtilisateurMetier.getInstance().getById(resultat2.getInt(12)),null);
					formateurs.add(formateur);
				}
				Matiere matiere = new Matiere(resultat.getInt("id_matiere"), resultat.getString("nom"), resultat.getString("abreviation"),formateurs);
				matieres.add(matiere);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return matieres;
	}
	
	private Integer getLastId(){
		Integer result = null;
		String query = "SELECT max(id_matiere) AS id_matiere FROM matiere";
		ResultSet resultat = Request.getInstance().executeQuery(query);
		try {
			while(resultat.next()){
				result = resultat.getInt("id_matiere");
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return result;
	}


}
